package org.batatasframework.values;

import java.util.Date;
import java.util.List;

/**
 * 转值接口，方法与{@link ValueGetter}相同，区别在于这里是对一个指定的名称的属性进行转值
 * 
 * 这个接口修改，则{@link DelegateValueReader}这个类需要相应的进行修改
 * 
 * @author jackson
 *
 * @see DelegateValueReader
 */
public interface ValueReader {
	
	ValueGetter getValue(String name);
	
	/*
	 *  下面的方法是对应上面"ValueGetter getValue(String name);"的ValueGetter接口，
	 *  这两种方式取值都是一样的，只是为了方便，才采用这种方式分开
	 */

	//----------  对象值，允许为空
	String getString(String name);
	Integer getInteger(String name);
	Long getLong(String name);
	Boolean getBoolean(String name);
	Double getDouble(String name);
	Date getDate(String name, Object arg);
	
	//----------  基本类型的值，需要有默认值
	String getString(String name, String defaultValue);
	int getInteger(String name, int defaultValue);
	long getLong(String name, long defaultValue);
	boolean getBoolean(String name, boolean defaultValue);
	double getDouble(String name, double defaultValue);
	Date getDate(String name, Object arg, Date defaultValue);

	//----------  基本类型的值，不允许为空
	String notNullString(String name, String message);
	int notNullInteger(String name, String message);
	long notNullLong(String name, String message);
	boolean notNullBoolean(String name, String message);
	double notNullDouble(String name, String message);
	Date notNullDate(String name, Object arg, String message);
	<T extends Enum<T>> T notNullEnum(String name, Class<T> cls, String message);
	
	//----------  其它值的处理方式
	<T> List<T> asList(String name);

	<E extends Enum<E>> E toEnum(String name, Class<E> clazz);
	<E extends Enum<E>> E toEnum(String name, Class<E> clazz, E defaultValue);
	
	<T> T getObject(String name, Class<T> clazz);

	Class<?> getClassType(String name);
	Class<?> getClassType(String name, Class<?> defaultValue);
	
	boolean is(String name, Object target);
}
